/*
 loop( 1, 5, write ). --> 12345
 loop( 5, 1, write ). --> 54321
 
 range( 1, 5, L ). --> L=[1,2,3,4,5]
 range( 5, 1, L ). --> L=[5,4,3,2,1]
*/

end_up( A, B, C ) :-
	A < B,
	C is A+1.
	
end_down( A, B, C ) :-
	A > B,
	C is A-1.

range_gen( A, A, _, [A] ).
range_gen( A, B, Cond, [A|L] ) :- call( Cond, A, B, C ), range( C, B, L ).

range( A, B, L ) :-	A =< B, range_gen( A, B, end_up, L ).
range( A, B, L ) :-	A > B, range_gen( A, B, end_down, L ).

loop_gen( A, A, _ ).
loop_gen( A, B, Cond, Each ) :-
	call( Cond, A, B, C ),
	call( Each, A ),
	loop_gen( C, B, Each ).

loop( A, B, Each ) :- A =< B, loop_gen( A, B, end_up, Each ).
loop( A, B, Each ) :- A > B, loop_gen( A, B, end_down, Each ).


lloop( A, A, _ ).
lloop( A, B, + ) :-
	C is A + 1,
	write( A ),
	lloop( C, B, + ).
	
lloop( A, B, - ) :-
	C is A - 1,
	write( A ),
	lloop( C, B, - ).
	